package utils.file;

import java.io.File;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * description： <br>
 * createTime: 2018/3/2111:25 <br>
 *
 * @author zzh
 */
public interface FileService {

    /**
     *
     * Method Name：ls
     * Method Description: 列出文件夹下所有文件和文件夹信息<br>
     *
     * @param
     * @param
     * @param
     * @return
     * @throw
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/5/25 16:00
     */
    List<FileInfo> ls(String remoteDirectoryPath);

    /**
     *
     * Method Name：mkdir
     * Method Description: 创建目录<br>
     *
     * @param   remoteDirectoryPath 要创建的目录路径
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/5/25 15:59
     */
    boolean mkdir(String remoteDirectoryPath);

    /**
     *
     * Method Name：rename
     * Method Description: 重命名指定目录下的文件或文件夹<br>
     *
     * @param   remoteDirectoryPath 目录路径
     * @param   remoteFileName      文件或文件夹的名称
     * @param   newFileName         文件或文件夹的新名称
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/5/25 15:58
     */
    boolean rename(String remoteDirectoryPath, String remoteFileName, String newFileName);

    /**
     * Method Name： uploadFiles
     * Method Description: 批量操作文件上传<br>
     *
     * @param desFoldPath 目标路径
     * @param srcFiles    源文件路
     * @return 操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:02
     */
    boolean uploadFiles(String desFoldPath, String... srcFiles);

    /**
     * Method Name： uploadFiles
     * Method Description: 批量文件上传<br>
     *
     * @param desFoldPath 目标路径
     * @param srcFiles    源文件路
     * @return 操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:02
     */
    boolean uploadFiles(String desFoldPath, Collection<File> srcFiles);

    /**
     * Method Name： uploadFile
     * Method Description: 单个文件上传<br>
     *
     * @param srcFile     源文件
     * @param desFoldPath 目标路径
     * @param desFileName 目标文件名
     * @return  操作结果
     * @throw
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:47
     */
    boolean uploadFile(String srcFile, String desFoldPath, String desFileName);

    /**
     *  推荐使用，直接根据输入流上传，在不需要生成本地文件时，可以减少一次IO操作
     * Method Name：uploadFile
     * Method Description: <br>
     *
     * @param inputStream
     * @param desFoldPath 目标文件夹路径
     * @param desFileName 目标文件名
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:51
     */
    boolean uploadFile(InputStream inputStream, String desFoldPath, String desFileName);

    /**
     *  推荐使用，直接把获取到的byte[]上传，在不需要生成本地文件时，可以减少一次IO操作
     * Method Name：uploadFile
     * Method Description: <br>
     *
     * @param bytes       要上传的byte数组
     * @param desFoldPath 目标文件夹路径
     * @param desFileName 目标文件名
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:51
     */
    boolean uploadFile(byte[] bytes, String desFoldPath, String desFileName);

    /**
     * Method Name： uploadFile
     * Method Description: 单个文件上传<br>
     *
     * @param srcPath     源文件
     * @param desPath 目标路径
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:47
     */
    boolean downloadFiles(String srcPath, String... desPath);

    /**
     *  推荐使用，直接获取下载的byte[]，在不需要生成本地文件时，可以减少一次IO操作
     * Method Name：downloadFileToBytes
     * Method Description: <br>
     *
     * @param desFile 目标文件名
     * @param desPath 目标路径
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:51
     */
    byte[] downloadFileToBytes(String desFile, String desPath);

    /**
     *  推荐使用，直接获取下载的byte[]，在不需要生成本地文件时，可以减少一次IO操作
     * Method Name：downloadFileToBytes
     * Method Description: <br>
     *
     * @param desFilePath 目标文件路径
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:51
     */
    default byte[] downloadFileToBytes(String desFilePath) {
        FilePathResolver pathResolver = new FilePathResolver(desFilePath);
        return downloadFileToBytes(pathResolver.fileName, pathResolver.filePath);
    }

    /**
     * Method Name： uploadFile
     * Method Description: 批量删除文件<br>
     *
     * @param filePaths     目标文件
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:47
     */
    boolean rm(String... filePaths);

    /**
     * Method Name： uploadFile
     * Method Description: 删除单个文件<br>
     *
     * @param files     目标文件
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 9:47
     */
    boolean rm(Set<String> files);

    /**
     *
     * Method Name：copy
     * Method Description: 拷贝文件夹<br>
     *
     * @param   srcFolerPath    源文件夹
     * @param   desFolderPath   目标文件夹
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 15:42
     */
    boolean copyFolder(String srcFolerPath, String desFolderPath);

    /**
     *
     * Method Name：copy
     * Method Description: 拷贝文件夹<br>
     *
     * @param   srcFilePath     源文件路径
     * @param   desFolderPath   目标文件夹
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 15:42
     */
    default boolean copyFile(String srcFilePath, String desFolderPath) {
        FilePathResolver pathResolver = new FilePathResolver(srcFilePath);
        byte[] bytes = downloadFileToBytes(pathResolver.fileName, pathResolver.filePath);
        if(bytes == null) {
            return false;
        }
        return uploadFile(bytes, desFolderPath, pathResolver.fileName);
    }

    /**
     *
     * Method Name：copy
     * Method Description: 拷贝文件夹<br>
     *
     * @param   srcFilePath     源文件路径
     * @param   desFolderPath   目标文件夹
     * @return  操作结果
     * <p>creator：zhihui.zhou
     * <p>createTime：2018/3/22 15:42
     */
    default boolean copyFile(String srcFilePath, String desFolderPath, String desFileName) {
        FilePathResolver pathResolver = new FilePathResolver(srcFilePath);
        byte[] bytes = downloadFileToBytes(pathResolver.fileName, pathResolver.filePath);
        if(bytes == null) {
            return false;
        }
        return uploadFile(bytes, desFolderPath, desFileName);
    }

    class FilePathResolver {
        String fileName;
        String filePath;
        public FilePathResolver(String srcFilePath) {
            String temp = srcFilePath.replaceAll("^[\\\\/]+", "").
                                    replaceAll("[\\\\/]+$", "").
                                    replaceAll("[\\\\/]+", "/");
            int lastIndex = temp.lastIndexOf("/");
            fileName = temp.substring(lastIndex + 1);
            filePath = lastIndex < 0 ? "" : temp.substring(0, lastIndex);
        }
        public String getFileName() {
            return fileName;
        }


        public String getFilePath() {
            return filePath;
        }
    }
}
